/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package loja.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import loja.dao.exceptions.BuscaException;
import loja.dao.exceptions.ImpossivelAtualizarException;
import loja.dao.exceptions.ImpossivelCriarException;
import loja.dao.exceptions.ImpossivelDeletarException;
import loja.dominio.ItemDeVenda;
import loja.dominio.Venda;

/**
 *
 * @author Administrador
 */
public class ItemDeVendaDao extends AbstractGenericDao<ItemDeVenda> {

    @Override
    public void criar(ItemDeVenda item) throws ImpossivelCriarException {
        String sql = "insert into itemdevenda (idvenda, idproduto, quantidade)" + " values (?,?,?)";

        PreparedStatement stmt = null;
        try {

            //iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, item.getVenda().getId());
            stmt.setLong(2, item.getProduto().getId());
            stmt.setLong(3, item.getQuantidade());
            stmt.execute();

            //comitarTransacao();
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelCriarException("Não foi possível criar uma nova venda.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public void atualizar(ItemDeVenda item) throws ImpossivelAtualizarException {
        String sql = "update itemdevenda set idproduto=? where iditem=?";
        PreparedStatement stmt = null;
        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, item.getVenda().getId());
            stmt.setLong(2, item.getProduto().getId());
            stmt.setLong(3, item.getQuantidade());
            stmt.setLong(4, item.getId());
            stmt.execute();
            comitarTransacao();
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelAtualizarException("Não foi possível atualizar o item de venda.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public void deletar(ItemDeVenda item) throws ImpossivelDeletarException {
        String sql = "delete from itemdevenda where iditem=?";
        PreparedStatement stmt = null;

        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, item.getId());
            stmt.execute();
            comitarTransacao();
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelDeletarException("Não foi possível atualizar o item de venda.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public ItemDeVenda buscar(Long id) throws BuscaException {
        String sql = "select * from itemdevenda where id_produto=?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        ItemDeVenda item = null;

        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, id);
            rs = stmt.executeQuery();
            while (rs.next()) {
                item = construirItem(rs);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar o produto.");
        }
        return item;
    }

    @Override
    public List<ItemDeVenda> buscarTodos() throws BuscaException {
        String sql = "select * from itemdevenda";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<ItemDeVenda> itens = null;
        ItemDeVenda item = null;

        try {
            stmt = getConexao().prepareStatement(sql);
            rs = stmt.executeQuery();
            itens = new ArrayList<ItemDeVenda>();
            while (rs.next()) {
                item = construirItem(rs);
                itens.add(item);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar os produtos.");
        }
        return itens;
    }

    public List<ItemDeVenda> buscarPorVenda(Venda venda) throws BuscaException {
        String sql = "select * from itemdevenda where idvenda=?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<ItemDeVenda> itens = null;
        ItemDeVenda item = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, venda.getId());
            rs = stmt.executeQuery();
            itens = new ArrayList<ItemDeVenda>();

            while (rs.next()) {
                item = construirItem(rs);
                itens.add(item);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar as Marcas.");
        }
        return itens;
    }

    @Override
    public long contar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    private ItemDeVenda construirItem(ResultSet rs) throws SQLException, BuscaException {
        ItemDeVenda item = new ItemDeVenda();
        ProdutoDao produtoDao = new ProdutoDao();
        VendaDao vendaDao = new VendaDao();

        item.setId(rs.getLong("iditem"));
        item.setVenda(vendaDao.buscar(rs.getLong("idvenda")));
        item.setProduto(produtoDao.buscar(rs.getLong("idproduto")));
        item.setQuantidade(rs.getInt("quantidade"));

        return item;
    }
}
